//package _rabbitmq.aliyun;
//
//import com.rabbitmq.client.AMQP;
//import com.rabbitmq.client.Channel;
//import com.rabbitmq.client.Connection;
//import com.rabbitmq.client.ConnectionFactory;
//
//import java.io.IOException;
//import java.nio.charset.StandardCharsets;
//import java.util.HashMap;
//import java.util.UUID;
//import java.util.concurrent.ExecutionException;
//import java.util.concurrent.TimeoutException;
//
//public class ProducerTest {
//    // 推荐将AK/SK/ARN等信息在环境变量中配置，若将其明文保存在工程代码中，将带来不必要的数据泄露风险。
//    // 阿里云账号的AccessKey ID。
//    private static final String alibabaAccessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
//    // 阿里云账号的AccessKey Secret。
//    private static final String alibabaAccessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
//    // 阿里云服务所在的Region。
//    private static final String region = System.getenv("ALIBABA_CLOUD_REGION");
//    // 阿里云角色ARN，从控制台获取。
//    private static final String roleARN = System.getenv("ALIBABA_CLOUD_ROLE_ARN");
//    //设置实例的接入点。
//    private static final String hostName = "xxx.xxx.aliyuncs.com";
//    private static final String instanceId = "${InstanceId}";
//    //设置实例的Vhost。
//    private static final String virtualHost = "${VirtualHost}";
//    //设置Exchange、Queue和绑定关系。
//    private static final String exchangeName = "${ExchangeName}";
//    private static final String queueName = "${QueueName}";
//    private static final String routingKey = "${RoutingKey}";
//    //设置Exchange类型。
//    private static final String exchangeType = "${ExchangeType}";
//
//    public static void main(String[] args) throws InterruptedException, IOException, TimeoutException, ExecutionException {
//        ConnectionFactory factory = new ConnectionFactory();
//        // 设置接入点，在云消息队列 RabbitMQ 版控制台实例详情页面查看。
//        factory.setHost(hostName);
//        // ${instanceId}为实例ID，在云消息队列 RabbitMQ 版控制台概览页面查看。
//        AliyunCredentialsProvider aliyunCredentialsProvider =
//                new AliyunCredentialsProvider(instanceId);
//        updateSTSProperties(aliyunCredentialsProvider);
//        // ${instanceId}为实例ID，在云消息队列 RabbitMQ 版控制台实例详情页面查看。
//        factory.setCredentialsProvider(aliyunCredentialsProvider);
//        //设置为true，开启Connection自动恢复功能；设置为false，关闭Connection自动恢复功能。
//        factory.setAutomaticRecoveryEnabled(true);
//        factory.setNetworkRecoveryInterval(5000);
//        // 设置Vhost名称，请确保已在云消息队列 RabbitMQ 版控制台上创建完成。
//        factory.setVirtualHost(virtualHost);
//        // 默认端口，非加密端口5672，加密端口5671。
//        factory.setPort(5672);
//        // 基于网络环境合理设置超时时间。
//        factory.setConnectionTimeout(30 * 1000);
//        factory.setHandshakeTimeout(30 * 1000);
//        factory.setShutdownTimeout(0);
//        Connection connection = factory.newConnection();
//        Channel channel = connection.createChannel();
//        channel.exchangeDeclare(exchangeName, exchangeType, true, false, false, null);
//        channel.queueDeclare(queueName, true, false, false, new HashMap<String, Object>());
//        channel.queueBind(queueName, exchangeName, routingKey);
//        // 开始发送消息，3600条消息，每条发送后暂停1秒，将持续1小时。
//        for (int i = 0; i < 3600; i++) {
//            try {
//                if (aliyunCredentialsProvider.isNearlyExpired()) {
//                    // 认证可能过期，重新认证
//                    System.out.println("[WARN] Token maybe expired, so try to update it.");
//                    updateSTSProperties(aliyunCredentialsProvider);
//                    factory.setCredentialsProvider(aliyunCredentialsProvider);
//                    // 当配置更新后，需要重新建立连接。
//                    connection = factory.newConnection();
//                    channel = connection.createChannel();
//                }
//                // ${ExchangeName}必须在云消息队列 RabbitMQ 版控制台上已存在，并且Exchange的类型与控制台上的类型一致。
//                // ${RoutingKey}根据业务需求填入相应的RoutingKey。
//                AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().messageId(UUID.randomUUID().toString()).build();
//                channel.basicPublish(exchangeName, routingKey, true, props,
//                        ("消息发送Body-"  + i).getBytes(StandardCharsets.UTF_8));
//                System.out.println("[SendResult] Message sent successfully, messageId: " + props.getMessageId());
//                Thread.sleep(1000L);
//            } catch (Exception e) {
//                System.out.println("[ERROR] Send fail, error: " + e.getMessage());
//                Thread.sleep(5000L);
//            }
//        }
//        connection.close();
//    }
//
//    public static void updateSTSProperties(AliyunCredentialsProvider aliyunCredentialsProvider) throws ExecutionException, InterruptedException {
//        System.out.println("Try to update STS properties");
//        // 推荐将AK/SK在环境变量中配置，若将其明文保存在工程代码中，将带来不必要的数据泄露风险。
//        aliyunCredentialsProvider.updateProperties(alibabaAccessKeyId, alibabaAccessKeySecret, region, roleARN);
//    }
//}